#include <stdio.h>
#include <string.h>
#define MaxSize  10
// 静态分配
typedef struct {
    int data[MaxSize];
    int length;
}SqList;

void InitList(SqList *L){
    L->length=0;
    for(int i =0;i<MaxSize;i++){
        L->data[i]=0;
    }
}

// CRUD
int addData(SqList *L,int data){
    if(L->length>=MaxSize){
        return 0;
    }
    L->data[L->length]=data;
    L->length++;
    return 1;
}

int alterData(SqList *L ,int index ,int newData){
    if(index>L->length||index<=0){
        return 0;
    }
    L->data[index-1]=newData;
    return 1;
}

int deleteData(SqList *L, int index, int *e) {
    if (index > L->length || index <= 0) {
        return 0;
    }
    // 通过指针将被删除的元素值返回给调用者
    *e = L->data[index - 1];
    // 将删除位置之后的元素依次向前移动一位
    for (int i = index - 1; i < L->length - 1; i++) {
        L->data[i] = L->data[i + 1];
    }
    // 顺序表长度减 1
    L->length--;
    return 1;
}
// 打印
void toString(SqList L ){
    printf("[ ");
    for(int i =0;i<L.length;i++){
       printf("%d  ", L.data[i]);
    }
    printf("  ]  ");
    printf("length:%d\n",L.length);
}
// 新增的测试方法
void testSequenceList(SqList *L) {
    char command[20];
    int data, index, newData, deleted;
    while (1) {
        printf("请输入操作 (add/adds/alter/delete/show/exit): \n");
        scanf("%s", command);

        if (strcmp(command, "add") == 0) {
            printf("请输入要添加的数据: \n");
            scanf("%d", &data);
            if (addData(L, data)) {
                printf("数据添加成功。\n");
            } else {
                printf("顺序表已满，添加失败。\n");
            }
            toString(*L);
        } else if (strcmp(command, "adds") == 0) {
            printf("请输入要批量添加的数据，以空格分隔，输入非数字结束输入: \n");
            while (scanf("%d", &data) == 1) {
                if (!addData(L, data)) {
                    printf("顺序表已满，部分数据未添加成功。\n");
                    break;
                }
            }
            // 清除输入缓冲区中的非数字字符
            while (getchar() != '\n');
            toString(*L);
        } else if (strcmp(command, "alter") == 0) {
            printf("请输入要修改的元素索引 (从 1 开始): \n");
            scanf("%d", &index);
            printf("请输入新的数据: \n");
            scanf("%d", &newData);
            if (alterData(L, index, newData)) {
                printf("数据修改成功。\n");
            } else {
                printf("索引超出范围，修改失败。\n");
            }
            toString(*L);
        } else if (strcmp(command, "delete") == 0) {
            printf("请输入要删除的元素索引 (从 1 开始): \n");
            scanf("%d", &index);
            if (deleteData(L, index, &deleted)) {
                printf("数据删除成功，删除的数据是: %d\n", deleted);
            } else {
                printf("索引超出范围，删除失败。\n");
            }
            toString(*L);
        } else if (strcmp(command, "show") == 0) {
            toString(*L);
        } else if (strcmp(command, "exit") == 0) {
            printf("退出测试。\n");
            break;
        } else {
            printf("无效的操作，请重新输入。\n");
        }
    }
}
int main(){
    SqList L;
    InitList(&L);
    testSequenceList(&L);
    return 0;
}